package com.hroze.util;

import org.apache.log4j.Logger;

import flexjson.JSONDeserializer;
import flexjson.JSONSerializer;

/**
 * json 工具类
 * @author ahoo
 *
 */
public class JsonUtil {

	public static final Logger log = Logger.getLogger(JsonUtil.class);
	/**
	 * 完整默认序列器（包含类信息，适用于反向序列化）
	 */
	public static final JSONSerializer ser = new JSONSerializer();
	/**
	 * 去掉类信息序列器（不需要反向使用的推荐）
	 */
	public static final JSONSerializer Ser = new JSONSerializer();
	/**
	 * 解码器
	 */
	public static final JSONDeserializer der = new JSONDeserializer();

	/**
	 * 指定名字序列化
	 * 
	 * @param name
	 *            序列后名称
	 * @param obj
	 *            要序列化的对象
	 * @return json <br> {<br>
	 *         data:{<br>
	 *         id:1,<br>
	 *         unit:'12',<br>
	 *         ....<br> }<br> }
	 */
	public static String objectToJson(String name, Object obj) {
		String json = Ser.exclude("*.class").serialize(name, obj);
		return json;
	}

	/**
	 * @param json
	 *            json格式的字符串
	 * @return java 对象
	 */
	public static Object jsonToObj(String json) {
		return der.deserialize(json);
	}

	/**
	 * 对象转化为json
	 * @param o
	 * @return
	 */
	public static String objToJson(Object o) {
		String json = ser.serialize(o);
		log.debug(json);
		return json;
	}

	/**
	 * 对象转化为json
	 * 
	 * @param o
	 *            任意对象
	 * @return
	 * 
	 */
	public static String objectToJson(Object o) {
		String json = Ser.exclude("*.class").serialize(o);
		log.debug("序列化结果:" + json);
		return json;
	}

	/**
	 * 增加更深的属性序列化
	 * 
	 * @param fields
	 *            序列化参数数组
	 * @param o
	 *            被序列化对象
	 * @return
	 */
	public static String objectToDeepJson(Object o) {
		String json = Ser.exclude("*.class").deepSerialize(o);
		log.debug("序列化结果:" + json);
		return json;
	}

	/**
	 * 指定属性序列化为json
	 * 
	 * @param fields
	 *            序列化参数数组
	 * @param o
	 *            被序列化对象
	 * @return
	 */
	public static String objectToJson(Object o, String... fields) {
		String json = new JSONSerializer().include(fields).exclude("*")
				.serialize(o);
		log.debug("序列化结果:" + json);
		return json;
	}

	/**
	 * 指定不序列化的属性生成json
	 * 
	 * @param fields
	 *            序列化参数数组
	 * @param o
	 *            被序列化对象
	 * @return
	 */
	public static String objectToJson(String[] excludeFields, Object o) {
		String json = new JSONSerializer().include("*").exclude(excludeFields)
				.exclude("*.class").serialize(o);
		log.debug("序列化结果:" + json);
		return json;
	}
}
